#include <stdlib.h>
#include <iostream>
#include <fstream>

#include <string.h>
#include "../common/ArchivoIni.h"
#include "../logger/logger.h"
#include "../common/Argv.h"
#include "../common/StringUtils.h"
#include "../channel_common/ChannelInterface.h"
#include "../channel_common/ChannelCommon.h"
#include "../IPC/ClientSocket.h"
#include "../middleware/CommunicationVendedor.h"

int main(int argc, char **argv)
{

	try
	{
		char buffer[TAM_BUFFER];

		Argv args(argv);

		if (args.getArgc() != 2)
		{
			std::cout <<"Canal salida agente: Cantidad de parametros invalida: "<<
								 StringUtils::NumberToString(args.getArgc())<<std::endl;
			exit(1);
		}

		std::string hostName = args.getArg(1);
		std::string server;
		int puertoEntrada = 0;

		CLogger::create("Canal salida host:"+hostName);

		MapaIni config = ArchivoIni::parsearComoIni("config.ini");

		server = config["server_vend"];
		puertoEntrada = StringUtils::StringToNumber<int>(config["puerto_entrada_vend"]);

		// Me conecto al puerto de Entrada del servidor.
		ipc::ClientSocket socketSalida;
		socketSalida.connect(server, puertoEntrada);

		CLogger::log("Conectado al socket:  "+StringUtils::NumberToString(puertoEntrada),
										LogLevelEnum::INFO);

		//Establecimiento de conexion
		channel::ChannelMessage message;

		channel::ChannelInterface queue(channel::ChannelInterface::SENDER, hostName);

		//Ciclo ppal (run)
		bool deboSeguir = true;

		while (deboSeguir)
		{
			queue.getFromQueue(message);

			if (message.tipo == channel::CHANNEL_END_MSG)
				deboSeguir = false;

			CLogger::log("Se obtuvo msg de la MQ",LogLevelEnum::DEBUG);

			memcpy(buffer, &message, sizeof(channel::ChannelMessage));

			CLogger::log("Obtuve un mensaje para:"+
					StringUtils::NumberToString(message.destino)+
					" de tamaño:"+StringUtils::NumberToString(message.size)+
					" y contenido"+StringUtils::toHexaString(message.payload,message.size));

			socketSalida.send(buffer, TAM_BUFFER);
		}

		socketSalida.close();
		CLogger::log("Canal Salida Agente - Finalizando.",LogLevelEnum::INFO);
	}
	catch (Exception &e)
	{
		CLogger::log("Excepcion:"+e.what_str(),LogLevelEnum::FATAL);
		exit(-1);
	}
}

